iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
Modern Web

Laravel 8: For Beginners系列 第 3

Configuration

  • 分享至 

  • xImage
  •  

概要

  • 應用程式設定
    • .env
    • config/ 資料夾
  • 外部服務連接
    • 以 Docker 啟動外部服務
    • Laravel 連接服務

應用程式設定

Laravel 的設定檔位於 config/ 資料夾,然而在介紹它之前,要先瞭解 .env 檔案。

.env 檔

.env 是一個常見的 environment variable 設定方式,藉由一個獨立的檔案避免每次都需要重新設定環境變數。

以 Laravel Installer 建立的專案應該已經包含一個 .env 檔案,如果沒有的話可以從 .env.example 中複製出來。

  • 在 Laravel 的習慣中,.env 位於 .gitignore 範圍下,如果是從其它專案 clone 下來可能會不包含 .env

格式

一個合法的 .env 應該是如下範例的格式

APP_NAME=Laravel
APP_ENV=local

值得注意的是,.env 僅能使用 KEY=VALUE 格式,且都需要是字串型式。

如果 Value 字串中有包含空白,可以用 "" 將其包括起來。

APP_NAME="My First Laravel Project"

config/ 資料夾

Laravel 所有的應用程式設定都位於 config/ 資料夾,正常而言資料夾結構應如下所示:

$ tree config/
config
├── app.php
├── auth.php
├── broadcasting.php
├── cache.php
├── cors.php
├── database.php
├── filesystems.php
├── hashing.php
├── logging.php
├── mail.php
├── queue.php
├── services.php
├── session.php
└── view.php

0 directories, 14 files

概述

config/app.php 為例,可能會看到以下內容

<?php

return [
	 /*
    |--------------------------------------------------------------------------
    | Application Name
    |--------------------------------------------------------------------------
    |
    | This value is the name of your application. This value is used when the
    | framework needs to place the application's name in a notification or
    | any other location as required by the application or its packages.
    |
    */

    'name' => env('APP_NAME', 'Laravel'),

		// ...
]

我們可以利用 env() 這個函式去擷取 environment variable 的值:第一個參數代表 Key,第二個參數則表示若該 Key 不存在時使用的預設值。

env() 會同時取得目前系統中的 environment variable 及 .env 檔案的內容(相同參數的情況下,系統中 environment variable 的優先度大於 .env

  • 注意:應該只在 config/ 資料夾下使用 env() 函式,於專案中其它地方使用在某些設定下會有預期外的狀況發生。

取得 config 的值

在 Laravel 應用程式中,可以利用 config() 取得設定檔中的值。

<?php

config('app.name', 'Laravel');

config() 的第一個參數表示設定值,第二個參數表示若設定值不存在的預設值。

第一個參數的規則比較複雜一些:以 . 為分隔,第一個 . 之前表示 config/ 下的檔案名稱,第二個之後表示陣列的 Key,如果是多維陣列還可以再往下指定 Key。

<?php

// config/app.php
return [
	'settings' => [
		'foo' => true,
		'bar' => [
			'baz' => false,
		],
	],
];

config('app.settings.foo'); // true
config('app.settings.bar.baz'); // false
config('app.settings.miss'); // NULL
config('app.settings.miss', 'default'); // default

外部服務連接

以 Docker 啟動外部服務

一般而言,我個人習慣會用 Docker 啟動外部服務(如 Database 或 Redis 等),這樣不僅可以集中管理設定,也能夠隨時重置整個服務。

手動管理各服務

假設我們今天需要 PostgreSQL,我們可以用以下指令啟動一個 container

$ docker run --name database \
		-p 5432:5432 \
		-e POSTGRES_PASSWORD=secret

上述指令可以啟動一個 container

  • 名為 database
  • 綁定於 Port 5432(PostgreSQL 預設 Port)
  • 資料庫密碼為 secret
  • 註:Docker Container 不可以重複名稱與重複佔用相同的 Port,如果啟動失敗的話可以先檢查一下是否已經被佔用

自動管理各服務

對於日漸龐大的服務依賴,每次都要手動管理非常的麻煩。此時我們可以利用 docker-compose 去自動化管理各服務。

首先在專案根目錄建立一個 docker-compose.local.yml

version: '3'

services:
	database:
		image: postgres
		ports:
			- 5432:5432
		environment:
			POSTGRES_DB: laravel
			POSTGRES_USER: homestead
			POSTGRES_PASSWORD: secret
	redis:
		image: redis
		ports:
			- 6379

如此以來,使用 docker-compose up 就可以自動建立好兩個服務。

對於比較進階的用法(例如 mount volumes),請再自行查閱 Docker Compose 的文件

各 Image 都有不同的 environment 設定,在使用之前最好先行查閱各 Image 的說明:

Laravel 連接服務

Laravel 所有的設定都位於 config/ 資料夾下,建議先尋找要設定的值位於 config/ 的何處。例如要連接資料庫,設定位於 config/database.php

<?php

// config/database.php
return [
	  'default' => 'mysql',
	  'connections' => [
				// ...
	      'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'artiv'),
            'username' => env('DB_USERNAME', 'artiv'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],
				// ...
	  ],
];

從這邊可以看到在 .env 中要如何設定,參考此數的 Key 再到 .env 中設定值即可。


上一篇
Installation
下一篇
Base Features (Part 1)
系列文
Laravel 8: For Beginners14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言